Dado el ejemplo a continuación, ¿podría alguien indicar por qué mi clase C se muestra como anónima? Estoy tratando de validar la instancia de BC y siempre es falsa :(
Gracias de antemano.
class A { constructor() { this.a = 1 } }; class B extends A { constructor() { super(); this.a = 2; } } BC = class extends B { constructor() { super(); this.a = 3; } } console.log(A, B, BC) //[class A], [class B extends A], [class (anonymous) extends B] let test = new BC(); console.log(test instanceof BC) //false console.log(test.constructor.name) //''En la mayoría de las situaciones, al asignar una expresión de class anónima a algo (una variable, una propiedad en un inicializador de objeto, el nombre del parámetro si se usa una expresión de class como valor predeterminado del parámetro, ...) se asigna el nombre del objeto al clase. Ejemplo:
const A = class {}; console.log(A.name); // "A" const obj = { B: class {}, }; console.log(obj.B.name); // "B" function example(C = class {}) { console.log(C.name); // "C" } example();Pero hay una excepción específica para cuando agrega una propiedad a un objeto existente . Eso fue considerado un riesgo de seguridad por TC39 (imagínese que está almacenando una clase/función que le va a dar a un código que no es de confianza usando una clave que debe ser privada para su código y no expuesta al de ellos), por lo que es uno de los muy pocos lugares que no sucede:
const obj = {}; obj.A = class {}; console.log(obj.A.name); // "" Si desea que BC tenga un nombre, asígnele uno de forma explícita:
BC = class SomeNameHere extends B { // ...Lo mismo es cierto para las expresiones de funciones anónimas, consulte mi respuesta aquí para obtener más información al respecto.
En un comentario sobre la respuesta que has dicho:
... Sin embargo, la validación de la instancia aún se muestra como falsa. ¿Alguna sugerencia sobre lo que está causando esto?...
Eso no sucederá con el código de la pregunta, independientemente de si BC tiene un nombre. instanceof funciona bien de cualquier manera:
class A { constructor() { this.a = 1; } } class B extends A { constructor() { super(); this.a = 2; } } // With a name BC = class BC extends B { constructor() { super(); this.a = 3; } }; // Without a name BD = class extends B { constructor() { super(); this.a = 3; } }; console.log(A, B, BC); // [class A], [class B extends A], [class (anonymous) extends B] let test = new BC(); console.log(test instanceof BC); // true console.log(test.constructor.name); // "BC" let test2 = new BD(); console.log(test2 instanceof BD); // true console.log(test2.constructor.name); // "" .as-console-wrapper { max-height: 100% !important; }Su última clase es anónimo, porque nunca le da el nombre C. Simplemente crea una propiedad llamada C que contiene la clase anónimo.
Creo que la sintaxis de lo que espera se vería así:
... class C extends B { constructor() { super(); this.a = 3; } } var B = new B(); BC = new C();De esta manera, está definiendo una nueva clase llamada C y agrega una nueva propiedad también llamada C a B y la llena con una instancia de C.